﻿/* PC INpact Toolkit for Chrome™

	PC INpact Toolkit for Chrome™ est une extension destinée au navigateur Chrome permettant d'accéder à de nombreuses fonctionnalités de PC INpact.
	Vous y retrouverez les actualités, brèves, calendriers du site, mais aussi les comptes Twitter de l'équipe ou des fonctionnalités de recherche.
	Des notifications peuvent aussi être affichées sur votre bureau, à chaque nouvelle publication sur le site (actualités, dossiers, tests).

	Main author : LEGRAND David
	Mail : david@pcinpact.com
	
	Google Code Project : http://pci.im/code-pci-chrome 
	Forum : http://pci.im/forum-pci-chrome
	
    This file is part of PC INpact Toolkit for Chrome™.

    PC INpact Toolkit for Chrome™ is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    PC INpact Toolkit for Chrome™ is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with PC INpact Toolkit for Chrome™.  If not, see <http://www.gnu.org/licenses/>. 

    You're not allowed to use PC INpact Toolkit for Chrome™ name or logo without permission 

	Loading GIF : http://www.ajaxload.info/

 */

// La fonction qui récupère un élément depuis un objet XML
function get_xml_element(doc, tag_parent, tag_child, nb)
{
	return doc.getElementsByTagName(tag_parent)[nb].getElementsByTagName(tag_child)[0].childNodes[0].nodeValue;
}

// La fonction qui récupère un id depuis une URL
function get_id(link, char_clean, char_split)
{
	return link.substring(char_clean).split(char_split)[0];
}

// La fonction qui affiche les notifications depuis un objet XML
function notifier(doc, tag_item, tag_url, tag_title, char_clean, html_ext, last_id_s, suffixe, count_new)
{
	// On parcourt le flux jusqu'à la fin
	for (var h = 0; h < doc.getElementsByTagName(tag_item).length; h++) 
	{
		// On récupère le lien que l'on nettoie avant de l'envoyer, on place le tout dans un "id"
		// On récupère aussi le titre
		var url = get_xml_element(doc, tag_item, tag_url, h);
		var url_id = url.substring(char_clean).split(html_ext)[0];
		var title = get_xml_element(doc, tag_item, tag_title, h);

		// Si l'id est différent de celui stocké
		if (url_id != last_id_s) 
		{
			// On incrémente le compteur de nouveautés, si l'on traite les news
			if (suffixe == 'news') count_new++;

			// On affiche la notification HTML avec les infos nécessaires en paramètre
			notify_url('/html/notify_'
					+ suffixe
					+ '.html?id='
					+ url_id
					+ '&'
					+ encodeURI(title));
		} 
		// Si on retrouve l'id stocké, on s'arrête
		else break;
	}
	
	// On renvoie la valeur du compteur de nouveautés
	return count_new;
}

// La fonction qui parcourt le flux RSS et gère le décompte ainsi que les notifications
function read_flux(responseXML, suffixe, char_clean, last_id_s, count_new)
{
	// On ouvre l'élément XML et on le place dans une variable utilisable
	doc = responseXML.documentElement;

	// On récupère uniquement l'URL de la dernière actu
	var link = get_xml_element(doc, "item", "link", 0);

	// On extrait un id de cette actu que l'on place dans la variable last_id
	var last_id = get_id(link, char_clean, ".");

	// Si c'est la première fois que l'on lance l'extension, last_id_s n'est pas initialisé
	// Il faut l'initialiseravec la valeur last_id
	if (typeof (last_id_s) == 'undefined')
		last_id_s = last_id;

	// //////////////////////////////////////////
	//
	// Section de Test. Décommenter la ligne de code suivante pour
	// passer en mode test des notifications :
	//
	// last_id_s = 0;
	//
	// alert(last_id + " / " + last_id_s);
	//
	// //////////////////////////////////////////

	// On place last_id dans le localStorage pour le prochain check
	window.localStorage.setItem('last_id_' + suffixe, last_id);

	// Si les id sont différents
	// TODO : Si possible, inverser l'ordre d'apparition des notifications, à voir dans la temporisation de celles-ci
	if (last_id_s != last_id) 
	{
		count_new = notifier(doc, "item", "link", "title", char_clean, ".htm", last_id_s, suffixe, count_new);
	}

	// On enregistre la valeur de count_new, que si l'on traite les news
	if (suffixe == 'news')
		window.localStorage.setItem('badge_count', count_new);

	// On change le badge de l'extension pour afficher le nombre de nouvelles actualités, que si l'on traite les news
	badge_update(suffixe);
}

// La fonction qui gère les flux RSS
function check_rss(url, suffixe, char_clean) 
{
	// On récupère la dernière id déclarée, spécifique à chaque suffixe, si elle existe
	// Le suffixe est utilisé pour différencier les différents flux RSS gérés
	var last_id_s;
	if (window.localStorage.getItem('last_id_' + suffixe))
		last_id_s = window.localStorage.getItem('last_id_' + suffixe);

	// On initialise le compteur de nouveautés
	var count_new = 0;

	// S'il y a déjà des actualités "à lire", on incrémente d'autant le compteur
	if (window.localStorage.getItem('badge_count') != '')
		count_new = window.localStorage.getItem('badge_count');

	// on effectue la requête
	var result = ext_req("http://www.pcinpact.com/include/" + url, true);

	// On parcourt le flux et on gère les notifications & co
	read_flux(result, suffixe, char_clean, last_id_s, count_new);
}
